import com.fasterxml.jackson.databind.ObjectMapper;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.ArrayList;

// 要实现java对象就要有java类，而类中的属性务必使public或者是带有public的getter/setter ，否则json无法访问该对象的属性。
//另外，该类必须有无参版本的构造方法，如果不写任何构造方法，编译器能够自动生成无参的构造方法。
// （但是一旦写了有参的构造方法，就一定要自己手动写无参的构造方法）

//class Score {
//    public ArrayList<Integer> scores;
//}

class Student {
    public int studentId;
    public String studentName;
    // public Score score;
}

@WebServlet("/json")
public class JsonServlet extends HttpServlet {
    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 此处假设请求的body格式为：
        // {“studentId”:10, “studentName”:"张三" }

        // ObjectMapper类：① readValue方法：把JSON格式的数据转为java的对象
        //② writeValueAsString方法：把java对象转成Json格式的字符串
        ObjectMapper objectMapper = new ObjectMapper();
        Student s = objectMapper.readValue(req.getInputStream(), Student.class);
        System.out.println(s.studentId);
        System.out.println(s.studentName);

        // 千万不要忘记设置浏览器返回的字符集
        resp.setContentType("text/html; charset=utf8");
        resp.getWriter().write(s.studentId + "," + s.studentName);


        // 如果要在浏览器上返回的是json格式的字符集
        resp.setContentType("application/json; charset=utf8");
        // 将对象转成json格式的字符串
        resp.getWriter().write(objectMapper.writeValueAsString(s));
        // objectMapper.writeValue(resp.getWriter(),s);  // 把对象边转边写入字节流，但是不常用
    }
}
